package com.sensetime.bi.senselink.server.util;

import io.netty.buffer.ByteBuf;

public class ByteBufUtil {

    public static String convertByteBufToString(ByteBuf buf) {
        String str;
        if(buf.hasArray()) { // 处理堆缓冲区
            byte[] array = buf.array();
            str = new String(array, buf.arrayOffset() + buf.readerIndex(), buf.readableBytes());
        } else { // 处理直接缓冲区以及复合缓冲区
            byte[] bytes = new byte[buf.readableBytes()];
            buf.getBytes(buf.readerIndex(), bytes);
            str = new String(bytes, 0, buf.readableBytes());
        }
        return str;
    }

    public static int getPosByCRLF(ByteBuf buf) {
        byte[] bytes;
        int start = 0, end = buf.readableBytes();
        if(buf.hasArray()) { // 处理堆缓冲区
            bytes = buf.array();
            start = buf.arrayOffset() + buf.readerIndex();
        } else { // 处理直接缓冲区以及复合缓冲区
            bytes = new byte[end];
            buf.getBytes(buf.readerIndex(), bytes);
        }
        if (end <= start) {
            return 0;
        }
        for (int i=3; i < end - start; i++) {
            if (bytes[i-3] == '\r' && bytes[i-2] == '\n' && bytes[i-1] == '\r' && bytes[i] == '\n') {
                // 头部结束符
                return i;
            }
        }
        return 0;
    }
}
